import requests
import json


class News:
    """Содержит методы для получения новостей с VIOMS API. 
    Для инициализации нужен ID списка рассылки ВИОМС"""
    def __init__(self, news_channel_id: int, is_getting_old=False) -> None:
        self.channel_id = news_channel_id
        self.news_id = 1 if is_getting_old else 0
        self.news = []

    def check_news(self) -> dict:
        """Получает информацию в формате json с api ВИОМС. Возвращает Объект
        с ошибками или с количеством новых записей"""
        url = f"https://www.vioms.ru/api/mobile/v2/email_lists/{self.channel_id}/mailings.json?page=1"
        try:
            r = requests.get(url, timeout=4)
        except requests.exceptions.RequestException:
            return {"error": f"Connection error. URL: {url}"}
        try:
            news = json.loads(r.text)["mailings"]
        except json.JSONDecodeError or KeyError:
            return {"error": f"Not valid responce from URL: {url}."}
        news_id = self.news_id
        # FIX сортировка новостей по их айди в сторону уменьшения
        news.sort(key=(lambda i : int(i['id'])), reverse=True)
        self.news_id = int(news[0]["id"])
        
        if news_id != 0:
            self.news = [n for n in news if n["id"] > news_id]
        return {"news_count": len(self.news)}

    def get_news_items(self) -> list:
        """Возвращает список с объектами по каждой новости
        (заголовок, ссылка, полный HTML)"""
        news_data = []
        for n in self.news:
            url = f"https://www.vioms.ru/api/mobile/email_lists/{self.channel_id}/mailings/{n['id']}.json"
            r = requests.get(url)
            news_item = json.loads(r.text)
            try:
                news_item = self.get_post_by_id(self.channel_id, n['id'])
            except Exception:
                pass
            else:
                news_data.append(news_item)
        self.news = []
        return news_data

    def get_mock_news_data(self):
        return [{
            "title": "Расписание леуций на неделю",
            "link": "https://sattavalife.ru",
            "html": "<p>some text</p>"
        }]


    def get_post_by_id(self, list_id: int, post_id: int):
            url = f"https://www.vioms.ru/api/mobile/email_lists/{list_id}/mailings/{post_id}.json"
            r = requests.get(url)
            news_item = json.loads(r.text)
            try:
                if news_item["error"]: raise Exception(f"Error: {news_item['error']}")
            except KeyError:
                pass
            return {
                "title": news_item["subject"].strip(),
                "link": f"https://www.vioms.ru/mailings/{post_id}/full",
                "html": news_item["rendered_html"]
                }

